home *** CD-ROM | disk | FTP | other *** search
/ Shareware Grab Bag / Shareware Grab Bag.iso / 007 / modula.arc / BENCH.MOD < prev    next >
Encoding:
Text File  |  1985-05-30  |  20.8 KB  |  491 lines

  1. (* Read a text and count the number of words with length
  2.    1, 2, ... , 20, and those with length greater than 20.
  3.    Words are separated by blanks or ends of lines. *)
  4.  
  5. MODULE wordlengths;
  6.  
  7. FROM InOut IMPORT WriteString, WriteLn, WriteCard, OpenInput, Read, Done;
  8.  
  9.  
  10. VAR i,k: CARDINAL;
  11.     ch: CHAR;
  12.     count: ARRAY [1..21] OF CARDINAL;
  13.  
  14. BEGIN
  15.   OpenInput('TEXT');
  16.   FOR i := 1 TO 21 DO count[i] := 0 END;
  17.   LOOP
  18.     Read(ch);
  19.     IF NOT Done THEN EXIT END;
  20.     IF ('A' <= CAP(ch)) AND (CAP(ch) <= 'Z') THEN
  21.       k := 0;
  22.       REPEAT
  23.         INC(k); Read(ch);
  24.       UNTIL (CAP(ch)< 'A') OR ('Z' < CAP(ch));
  25.       IF k > 20 THEN k := 21 END;
  26.       INC(count[k])
  27.     END
  28.   END;
  29.   WriteLn;
  30.   WriteString('  Length  Count');
  31.   FOR i := 1 TO 21 DO
  32.     WriteCard(i,6); WriteCard(count[i],6)
  33.   END
  34. END wordlengths.
  35. 
  36.     END; (* with *)
  37.   END; (* if *)
  38. END printTree;
  39.  
  40. PROCEDURE search(x : CARDINAL; VAR p : ref);
  41. BEGIN
  42.   IF p = NIL THEN (* word is not in tree; insert it *)
  43.   NEW(p);
  44.   WITH p^ DO
  45.    key := x;
  46.    count := 1;
  47.    left := NIL;
  48.    right := NIL;
  49.   END; (* with *)
  50.   ELSIF x<p^.key THEN search(x, p^.left)
  51.   ELSIF x > p^.key THEN search(x,p^.right)
  52.   ELSE p^.count := p^.count + 1;
  53.   END;
  54. END search;
  55.  
  56. PROCEDURE delete(x : CARDINAL; VAR p : ref);
  57. VAR q : ref;
  58.   PROCEDURE del(VAR r : ref);
  59.   BEGIN
  60.     IF r^.right # NIL THEN
  61.      del(r^.right)
  62.     ELSE
  63.      q^.key := r^.key; 
  64.      q^.count := r^.count;
  65.      q := r;
  66.      r := r^.left;
  67.     END;
  68.   END del;
  69.  
  70. BEGIN (* delete *)
  71.   IF p = NIL THEN
  72.     WriteString(" word is not in tree");
  73.     WriteLn;
  74.   ELSIF x < p^.key THEN delete(x, p^.left)
  75.   ELSIF x > p^.key THEN delete(x,p^.right)
  76.   ELSE
  77.     q := p;
  78.     IF q^.right = NIL THEN p := q^.left
  79.     ELSIF q^.left = NIL THEN p := q^.right
  80.     ELSE del(q^.left);
  81.     END;
  82.   END;
  83. END delete;
  84.  
  85. BEGIN (*main*)
  86.   root := NIL;
  87.   ReadInt(k);
  88.   WHILE k # 0 DO
  89.    IF k > 0 THEN
  90.      WriteString(" insert");
  91.      WriteInt(k,6);
  92.      search(k,root);
  93.    ELSE
  94.      WriteString(" delete");
  95.      WriteInt(0-k,6);
  96.      delete(CARDINAL(0-k), root);
  97.    END;
  98.    printTree(root,0);
  99.    ReadInt(k);
  100.   END; (*while *)
  101. END tree.
  102.  
  103. r1) # (long2-1) THEN Str1[long2] := eos END;
  104. END StringIs;
  105.  
  106. PROCEDURE ShowString(Str : ARRAY OF CHAR );
  107.  
  108. (* Procedure to display a string on the console *)
  109.  
  110. VAR i,long : CARDINAL;
  111. BEGIN
  112.     long := Len(Str);
  113.     FOR i := 0 TO (long-1) DO
  114.         Write(Str[i]);
  115.     END;
  116. END ShowString;
  117.  
  118. PROCEDURE StringAdd (VAR Str1 : ARRAY OF CHAR; Str2 : ARRAY OF CHAR );
  119.  
  120. (* Procedure to concatenate two strings such that,                 *)
  121. (*                     Str1 = Str1 + Str2                          *)
  122. (*                                                                 *)
  123. (*-----------------------------------------------------------------*)
  124. (*  Error Handling : If Str2 will be concatenated to strign Str1   *)
  125. (*  in as much "free space" is availble.                           *)
  126. (*-----------------------------------------------------------------*)
  127.  
  128.  
  129. VAR 
  130.     i,long1,long2, hi : CARDINAL;
  131. BEGIN
  132.  
  133. (* Obtain the length of the strings  *)
  134.     hi := HIGH(Str1);
  135.     long1 := Len(Str1);
  136.     long2 := Len(Str2);
  137.  
  138. (* If string Str2 if too long pick up only the portion that will *)
  139. (* fit  in string Str1.                                          *)  
  140.     IF (long1+long2-1) > hi THEN long2 := hi - long1 + 1 END;
  141.         FOR i := 0 TO (long2-1) DO
  142.             Str1[i+long1] := Str2[i]
  143.         END;
  144.  
  145. (* Put the eos if string Str1 is not full to capacity *)
  146.         IF hi # (long1+long2-1) THEN Str1[long1+long2] := eos END;
  147. END StringAdd;
  148.  
  149. PROCEDURE StringDelete(VAR Str : ARRAY OF CHAR ; First,Last : CARDINAL);
  150.  
  151. (* Procedure to delete a portion of a string by specifying the first *)
  152. (* and last character by position.                                   *)
  153. (*                                                                   *)
  154. (*-------------------------------------------------------------------*)
  155. (*  Error Handling :                                                 *)
  156. (*                                                                   *)
  157. (*  (1) If Fisrt is greater than the string length, string Str will  *)
  158. (*      remain intact.                                               *)
  159. (*  (2) If Last is graeter than the string length, string Str will   *)
  160. (*      end at position Last.                                        *)
  161. (*-------------------------------------------------------------------*)
  162.  
  163.  
  164. VAR i,long : CARDINAL;
  165. BEGIN
  166.     long := Len(Str);
  167.  
  168. (* If the first character is greater than the string length ignore   *)
  169. (* the Procedure altogether.                                         *)
  170.  
  171.     IF First < long THEN
  172.  
  173.  
  174.        IF Last >= long (* Check if the last character *)
  175.                        (* position is within limits.  *)
  176.               THEN
  177.         Str[First] := eos
  178.  
  179.               ELSE (* Delete up to the last character *)
  180.                 FOR i := Last TO (long-1) DO
  181.             Str[First+i-Last-1] := Str[i]
  182.         END;
  183.  
  184.         (* Put the eos if string Str1 *)
  185.         Str[long+First-Last-1] := eos
  186.        END;
  187.     END;
  188. END StringDelete;    
  189.  
  190. PROCEDURE StringPos(Str1,Str2 : ARRAY OF CHAR ; Start : CARDINAL):CARDINAL;
  191.  
  192. (* Returns the position where the sub-string Str2 occurs within string *)
  193. (* starting at positon 'Start' Str1.                                   *)
  194. (*                                                                     *)
  195. (*---------------------------------------------------------------------*)
  196. (*  Error Handling :                                                   *)
  197. (*  (1) If Str2 is bigger than Str1 to begin with, then there can be   *)
  198. (*      no matching of Str2 in Str1.                                   *)
  199. (*  (2) If Start is greater than the length of Str1 then return zero   *)
  200. (*      as a result.                                                   *)
  201. (*---------------------------------------------------------------------*)
  202.  
  203.  
  204. VAR 
  205.     long1,long2,ptr1,ptr2,last : CARDINAL;
  206.     Found : BOOLEAN;
  207.     
  208. BEGIN
  209.  
  210. (* Initialize and obtain string lengths *)
  211.     IF Start = 0 THEN Start := 1 END;
  212.     ptr1 := Start-1; ptr2 :=0; last := ptr1;
  213.     Found := FALSE;
  214.     long1 := Len(Str1);
  215.     long2 := Len(Str2);
  216. (* Peform the function if the sub-string is indeed the smaller *)
  217.     IF (long1 >= long2) AND (Start <= (long1-1)) THEN
  218.         REPEAT    
  219.             IF Str1[ptr1] = Str2[ptr2]
  220.                 THEN
  221.                     IF ptr2 = 0 THEN last := ptr1 END;
  222.                     IF ptr2 = long2-1 
  223.                           THEN 
  224.                         Found := TRUE
  225.                           ELSE        
  226.                         INC(ptr2)
  227.                     END;    
  228.                 ELSE
  229.                     IF ptr2 > 0 THEN ptr1 := last; ptr2 := 0 END;
  230.             END;
  231.             INC(ptr1)
  232.         UNTIL (Found = TRUE) OR (ptr1 >= long1-1);
  233.     END; 
  234. (* Return zero if there was no match.                          *)
  235.     IF NOT Found THEN ptr1 := 0 
  236.              ELSE DEC(ptr1,long2-1)
  237.     END;
  238.     RETURN ptr1        
  239. END StringPos;
  240.  
  241. PROCEDURE StringLeft(VAR Str1 : ARRAY OF CHAR ;
  242.                          Str2 : ARRAY OF CHAR; Count : CARDINAL);
  243.  
  244. (* Procedure will return the 'Count' leftmost characters of string *)
  245. (* Str2 and save the result in string Str1.                        *)
  246. (*                                                                 *)
  247. (*-----------------------------------------------------------------*)
  248. (*  Error Handling :                                               *)
  249. (* (1) If Count = 0 then reassugn Count as 1.                      *)
  250. (* (2) If Count is greater than the string length then adjust it   *)
  251. (*     to equal the latter.                                        *)
  252. (*-----------------------------------------------------------------*)
  253.  
  254. VAR long : CARDINAL;
  255.  
  256. BEGIN
  257.  
  258.     StringIs(Str1,Str2);
  259.     long := Len(Str1) - 1;
  260.     IF Count = 1 THEN Count := 1 END;
  261.     IF Count > long THEN Count := long END;
  262.     IF Count <> long THEN
  263.           Str1[Count] := eos
  264.     END;
  265. END StringLeft;
  266.  
  267. PROCEDURE StringRight(VAR Str1 : ARRAY OF CHAR ;
  268.                           Str2 : ARRAY OF CHAR;  Count : CARDINAL);
  269.  
  270. (* Procedure will return the 'Count' rightmost characters of string *)
  271. (* Str2 and save the result in string Str1.                         *)
  272. (*                                                                  *)
  273. (*------------------------------------------------------------------*)
  274. (*  Error Handling : If Count is zero or greater than the string    *)
  275. (*  length then string Str1 will be an exact copy of Str2.          *)
  276. (*------------------------------------------------------------------*)
  277.  
  278. VAR i,long ,used: CARDINAL;
  279. BEGIN
  280.  
  281. (* Copy string Str2 into string Str1 and obtain its length.         *)
  282.     StringIs(Str1,Str2);
  283.     long := Len(Str1);
  284.     IF (Count <= long) AND (Count # 0) THEN 
  285.  
  286. (* Obtain the first character position to relocate string Str1.     *)
  287.         used := long - Count;
  288.         FOR i := 0 TO (Count-1) DO
  289.             Str1[i] := Str1[used+i]
  290.         END;
  291.         Str1[Count] := eos
  292.     END;
  293. END StringRight;
  294.  
  295. PROCEDURE StringMid(VAR Str1 : ARRAY OF CHAR ;
  296.                         Str2 : ARRAY OF CHAR;  Start, Count : CARDINAL);
  297.  
  298. (* Procedure will copy the portion of string Str2 from the character   *)
  299. (* position 'Start' and for 'Count' characters into string Str1.       *)
  300. (*                                                                     *)
  301. (*---------------------------------------------------------------------*)
  302. (*  Error Handling : If the sum of Start and Count is greater than the *)
  303. (*  string length then the resulting string Str1 will be identical to  *)
  304. (*  string Str2.                                                       *)
  305. (*---------------------------------------------------------------------*)
  306.  
  307. VAR i,long : CARDINAL;
  308. BEGIN
  309.     StringIs(Str1,Str2);
  310.     IF Start > 0 THEN DEC(Start) END;
  311.     long := Len(Str1);
  312.     IF (Start + Count) <= long THEN 
  313.         FOR i := Start TO (Start+Count-1) DO
  314.             Str1[i-Start] := Str1[i]
  315.         END;
  316.         IF HIGH(Str1) # Count THEN Str1[Count] := eos END;
  317.     END;
  318. END StringMid;
  319.  
  320. PROCEDURE StringRemove(VAR Str1 : ARRAY OF CHAR; Str2 : ARRAY OF CHAR);
  321.  
  322. (* Procedure to remove all occurences of sub-string Str2 from Str1. *)
  323.  
  324. VAR 
  325.     i,long1,long2,ptr,position,move,high : CARDINAL;
  326.  
  327. BEGIN
  328.     high := HIGH(Str1);
  329.     long1 := Len(Str1);
  330.     long2 := Len(Str2);
  331.     ptr := 1;
  332.     REPEAT 
  333.         position := StringPos(Str1,Str2,ptr);
  334.         IF position # 0 THEN (* Shift characters to overwrite Str2 *)
  335.             ptr := position - 1;
  336.             FOR i := (ptr+long2) TO (long1-1) DO
  337.                 Str1[i-long2] := Str1[i]
  338.             END;
  339.             DEC(long1,long2);
  340.             Str1[long1] := eos;
  341.         END;
  342.     UNTIL position = 0; (* Cannot find any more sub-strings *)
  343. END StringRemove;
  344.  
  345. PROCEDURE StringInsert(VAR Str1 : ARRAY OF CHAR; Str2 : ARRAY OF CHAR; 
  346.                           Start : CARDINAL);
  347.  
  348. (* Procedure will insert string Str2 in Str1 at the character *)
  349. (* position 'Start' of string Str1.                           *)
  350. (*                                                            *)
  351. (*------------------------------------------------------------*)
  352. (*  Error Handling : If there no room for string Str2 to be   *)
  353. (*  inserted entirely string Str1 will remain intact.         *)
  354. (*------------------------------------------------------------*)
  355.  
  356. VAR
  357.    i,long1,long2 : CARDINAL;
  358. BEGIN
  359.         DEC(Start);
  360.         long1 := Len(Str1);
  361.         long2 := Len(Str2);
  362.         IF (long1+long2-1) <= HIGH(Str1) THEN 
  363.  
  364. (* Relocate portions of Str1 to make way for string Str2.      *)
  365.                 FOR i := (long1-1) TO Start BY -1 DO
  366.                         Str1[i+long2] := Str1[i]
  367.                 END;
  368.  
  369. (* Copy string Str2 into the reserved loaction of string Str1. *)
  370.                 FOR i := Start TO (Start+long2-1) DO
  371.                         Str1[i] := Str2[i-Start]
  372.                 END;
  373.                 INC(long1,long2);
  374.                 IF (long1-1) < HIGH(Str1) THEN Str1[long1] := eos END;
  375.         END;                
  376. END StringInsert;
  377.  
  378. PROCEDURE StringReplace(VAR Str1 : ARRAY OF CHAR; Str2,Str3 : ARRAY OF CHAR);
  379.  
  380. (* Procedure will replace all occurences of sub-string Str2, in string *)
  381. (* Str1, by sub-string Str3.                                           *)
  382.  
  383. VAR 
  384.     i,long1,long2,long3,ptr,pos,Stringhigh : CARDINAL;
  385. BEGIN
  386.     long1 := Len(Str1);
  387.     long2 := Len(Str2);
  388.     long3 := Len(Str3);
  389.     ptr := 1;
  390.     Stringhigh := HIGH(Str1)+1;
  391.     REPEAT
  392.         pos := StringPos(Str1,Str2,ptr);
  393.         IF pos # 0 THEN
  394.             ptr := pos;
  395.             StringDelete(Str1,ptr,(ptr+long2-1));
  396.             StringInsert(Str1,Str3,ptr);
  397.             long1 := long1 - long2 + long3;
  398.             IF long1 = Stringhigh THEN pos :=0
  399.                                   ELSE Str1[long1] := eos
  400.             END;
  401.         END;
  402.     UNTIL pos = 0;
  403. END StringReplace;
  404.  
  405. PROCEDURE StringChange(VAR Str1 : ARRAY OF CHAR; Str2,Str3 : ARRAY OF CHAR;
  406.                            Start,Repeat:CARDINAL);
  407.  
  408. (* Procedure will replace sub-string Str2 with Str3 in string Str1 *)
  409. (* start at character position 'Start' and for 'Repeat' times.     *)
  410.  
  411. VAR 
  412.     i,long1,long2,long3,ptr,pos,Stringhigh : CARDINAL;
  413. BEGIN
  414.     long1 := Len(Str1);
  415.     long2 := Len(Str2);
  416.     long3 := Len(Str3);
  417.     ptr := Start;
  418.     Stringhigh := HIGH(Str1)+1;
  419.     REPEAT
  420.         pos := StringPos(Str1,Str2,ptr);
  421.         IF pos # 0 THEN
  422.             ptr := pos;
  423.             StringDelete(Str1,ptr,(ptr+long2-1));
  424.             StringInsert(Str1,Str3,ptr);
  425.             long1 := long1 - long2 + long3;
  426.             IF long1 = Stringhigh THEN pos :=0
  427.                                   ELSE Str1[long1] := eos
  428.             END;
  429.         DEC(Repeat);
  430.         END;
  431.     UNTIL pos*Repeat = 0;
  432. END StringChange;
  433.  
  434. PROCEDURE StringAlter(VAR Str1 : ARRAY OF CHAR; Str2 : ARRAY OF CHAR; 
  435.                                 Start : CARDINAL);
  436.  
  437. (* Procedure will overwrite string Str1 with sub-string Str2 starting *)
  438. (* at position 'Start'.                                               *)
  439. (*                                                                    *)
  440. (*--------------------------------------------------------------------*)
  441. (*  Error Handling : If there is no room for string Str2 to fit in    *)
  442. (*  its entirey string Str1 will remain intact.                       *)
  443. (*--------------------------------------------------------------------*)
  444.  
  445. VAR
  446.     i,long,ptr : CARDINAL;
  447. BEGIN
  448.     DEC(Start);
  449.     long := Len(Str2);
  450.     IF (Start+long-1) <= HIGH(Str1) THEN 
  451.         FOR i := Start TO (Start+long-1) DO
  452.             Str1[i] := Str2[i-Start]
  453.         END;
  454.     END;
  455. END StringAlter;
  456.  
  457. PROCEDURE InputString (VAR Str : ARRAY OF CHAR);
  458.  
  459. (* Read string from the keyboard.                                    *)
  460.  
  461. VAR 
  462.     i,high : CARDINAL;
  463.     ch : CHAR;
  464. BEGIN
  465.     high := HIGH(Str);
  466.     i := 0;
  467.     REPEAT
  468.         Read(ch);
  469.         Write(ch);
  470.         IF ch # CHAR(177C)
  471.                 THEN 
  472.                     Str[i] := ch;
  473.                     INC(i)
  474.                 ELSE
  475.                     Write(' ');
  476.                     Write(ch);
  477.                     IF i > 0 THEN DEC(i) END;
  478.         END;
  479.     UNTIL (ch = CHAR(36C)) OR (i > high);
  480.     IF i <= high THEN 
  481.            DEC(i);
  482.            Str[i] := eos
  483.     END;
  484. END InputString;
  485.  
  486. END Strlib.
  487. )e'*** Make these changes permanent (y/n)?,2 ...wait>=PDCOM1:aêV===DIALING DIRECTORY sp Modem dialing command = rÄLong distance service +# = a«-# = d╕   Names+─Phone #   Comm Param  Echo Mesg Strip Pace ,⌠##·-e     x N   Np=!$Dial entry #:             | or...t&JEnter: R to revise or add to directorytM for manual dialingîF / B to page through directoryr░X to exit to terminal 5╩| For long distance service, precede entry # with +/-y+▒
  488. RMüâ &===DIALING d6===DIAL PHONE #: J(cancelled)N!ZRevise/add entry #:       | or...e!ÇEnter:  M to change modem commande ª+ / - to change long distance #s╩C to clear directory entriesΩX to exit to dialing prompts
  489. CName: Phone number: $,Communications parameters ok (y/n)?  TBaud rate: odParity: 
  490. p# data bits: s
  491. é# stop bits: s'öAre the remaining parameters ok (y/n)? t└Echo on (y/n)? n╘Messages on (y/n)? a ∞Strip/convert characters (y/n)? old strip/cnvt string: s,change this (y/n)? n3D(please refer to instructions in the documentation)/|new strip/cnvt string: cÿnew string ok (y/n)?░//~
  492. ║Pacing? p=╚  N  g╥nß
  493. ╪Is entry # µ ok (y/n)? o÷Modem dialing command:Long distance +#:m&Long distance -#:m<Clear directory from entry #: ^ ... through entry #:ex-- Are you sure (y/n)? töATDT£------------------------╕- --- --- ----&╩     ===FUNCTION KEY DIRECTORY===     ⌠ F1-10■F-   Input StringK  =  Press:  R to revise 4 -F assignmentsF F / B to page through directory=j X to exit to terminal ä Press Func. key to revise:ó or X to exit to terminal╛ -F─  Alt-F╬ Shft-F╪ Ctrl-FΓ New input string for n#ⁿ  as substitute for carriage returns $!Use ,! to leave key unchangediH!<space>v
  494. T! to clear key Df! Redialing...  *** HIT ANY KEY TO TERMINATE ***  (redial started at «!)
  495. ┤!===REDIALING  Ç;Ä8╬! REMOTE COMPUTER ON LINE  *** HIT ANY KEY TO PROCEED ***â"===CONNECTED WITH ,$"===REDIAL TERMINATED...back in terminal mode àX"  Elapsed time this call =      x" min      6å"*** This program requires that you have a serial port.└"(returning to DOS)Hå.┌"===PLEASE DO NOT BYPASS THE FREEWARE NOTICE=== #<<#>>#Not a valid file name.2#File not found.eF#Disk is write protected.b#Check disk drive.tx#Disk media error.tWêaê1ìÇTë
  496. ₧#CHECK PRINTERr@Iï%ì1╕#*** Invalid communications parameters. Try again.p"ε#*** Invalid parameters for entry #8Bì!$*** Invalid stripping for entry ##(CìB$TIMEOUTa N$PRINTOUT OFF ^$CHECK MODEMFn$OVERFLOW z$PRINTOUT OFFè$OVERFLOW--PRINTOUT OFF%è!¿$*** File(s) not found. Try again.#Çcî╥$*** DISK IS FULLµ$===DISK IS FULL===ⁿ$***CAN'T OPEN  nî%***ó%*** Either too many files, ora░`î @% Try again.tP%*** /X%*** Can't read/write file in the default drive.n#î%Correct and hit any key to resume..fHë└Uî╝% Sorry, NON-RECOVERABLE ERROR ▐% at line3"    If you have received this program from another user and4"  find it of value, your $35 contribution will be appreciated.5"6"                        ═══ Freeware ═══7"                      Post Office Box 8628"                       Tiburon, CA 949209":"   You are encouraged to copy this program as described below.;"<"  ** NOTICE:  Users of this program are granted a limited license to="     make copies of this program for trial use by others on a private>"     non-commercial basis.  This limited license does not include --?"  1. distributing this program in connection with any other product@"  2. making the program available for any consideration or 'disk fee'A"  3. posting the program for public access via telecommunications orB"  4. distributing the program in modified form.  Please cooperate.C"D"  Copyright (c) 1984 The Headlands Press, Inc.π"      =====   PC-TALK III    =====Σ"σ"       Communications Program forµ"       The IBM Personal Computerτ"Φ" Press: <Home> for command summaryΘ"        <Alt>-E if you can't seeΩ"               your keyboard inputM"PrtSc =  print screen contentsN" ^PrtSc =  contin. printout (or ^PgUp)O"  Alt-R =  Receive a file  (or PgDn)P"  Alt-T =  Transmit a file  (or PgUp)Q" transmit: pacing '=p'  binary '=b'R"tran/recv: XMODEM '=x'S"  Alt-V =  View file   Alt-Y = deleteT"  Alt-D =  Dialing directoryU"  Alt-Q =  redial last numberV"  Alt-K =  set/clear Func keys (Alt-J)W"  Alt-=    set/clear temp Alt keysX" Alt-E = Echo toggle  Alt-M = MessageY" Alt-S = Screendump   Alt-C = ClearscZ"  Alt-P =  communications Parameters["  Alt-F =  set program deFaults\"  Alt-L =  change Logged drive]"  Alt-W =  set margin Width alarm^"  Alt-Z =  elapsed time/current call_"  Alt-X =  eXit to DOS`"Ctrl-End = send sustained Break signal╗M Baud rate,300,Parity,E,Data bits,7,Stop bits,1,Echo,N,Messages,N╝M"Strip #1",0,Replace #1,0,"Strip #2",0,Replace #2,0,"Strip #3",0,Replace #3,0,Pacing p=,,Logged drive,"B:",Margin width,70╜M Screendump file,"B:SCRNDUMP.PCT",Redial delay,20,Connect prompt,CONNECT╛M Line 25 help,Y,Foreground,7,Background,0,High int